linxu DNS systemd-resolved
·
systemd-resolved 获取上游 DNS 的途径
systemd-resolved 不会依赖 /etc/resolv.conf 获取上游 DNS(因为那是它给应用程序提供的入口)。它通过更底层的、按网络接口(Link)独立配置 的方式获取上游 DNS:
网络管理器配置(主要来源):
- systemd-networkd: 如果使用 systemd-networkd 管理网络,会在网络配置文件(如 /etc/systemd/network/80-wired.network)中通过 DNS= 选项指定:
[Network]
DNS=192.168.1.1 8.8.8.8
DNS=1.1.1.1
- NetworkManager: 如果使用 GNOME/KDE 等桌面环境的 NetworkManager:
- 它会自动从 DHCP 服务器获取 DNS 信息。
- 或通过 GUI/nmcli 手动配置的 DNS 服务器(如 nmcli con mod eth0 ipv4.dns "192.168.1.1 8.8.8.8")。
- NetworkManager 会将这些配置通过 D-Bus 实时推送给 systemd-resolved。
systemd-resolved 全局配置文件 (/etc/systemd/resolved.conf):
可以作为备用或全局覆盖,使用 DNS= 选项:
[Resolve]
DNS=9.9.9.9 2620:fe::fe # 例如 Quad9 DNS
FallbackDNS=8.8.8.8 2001:4860:4860::8888 # 备用 Google DNS
Domains=~example.com # 搜索域
#DNSSEC=yes # 可选 DNSSEC 配置
- 重要: 接口特定配置(来自 systemd-networkd 或 NetworkManager)优先级高于 全局 resolved.conf 中的配置。
DHCP 客户端集成:
- 当网络接口通过 DHCP 获取 IP 地址时,DHCP 服务器通常会同时提供 DNS 服务器地址。
- systemd-networkd 或 NetworkManager 的 DHCP 客户端模块会自动捕获这些 DNS 信息,并将其作为该接口的 DNS 配置提供给 systemd-resolved。
VPN 或特殊网络接口:
当连接 VPN(如 OpenVPN, WireGuard)或使用特殊接口(如 PPPoE)时:
- VPN 客户端或接口管理器会动态添加其特定的 DNS 服务器地址到 systemd-resolved 中(通常通过 D-Bus API)。
- systemd-resolved 知道这些 DNS 服务器仅适用于通过该 VPN/接口路由的流量。
linux dns查询如何到达真正的上游 DNS?
-
应用程序发起查询: 浏览器等 App 请求 www.example.com。
-
查询发送到 stub: 根据 /etc/resolv.conf (指向 127.0.0.53),查询被发送到本机 systemd-resolved 服务。
-
systemd-resolved 处理:
- 检查本地缓存(如有缓存且有效,直接返回结果)。
- 检查是否属于 LLMNR/mDNS 域名(如 .local),如果是则在本地链路处理。
- 判断查询应使用哪个网络接口的上游 DNS (基于源接口、路由策略、域名后缀匹配)。
-
转发到上游 DNS: systemd-resolved 将查询转发给为该接口/域配置的真正上游 DNS 服务器(如 192.168.1.1 或 9.9.9.9)。
- 支持协议:传统 UDP/TCP DNS,或加密的 DNS-over-TLS (DoT) / DNS-over-HTTPS (DoH)(需配置)。
-
接收并处理响应:
- 接收上游 DNS 返回的响应。
- 可选进行 DNSSEC 验证(若配置)。
- 将响应结果缓存(根据记录的 TTL)。
- 将最终结果返回给发起查询的应用程序。